﻿if exists (select name from sysobjects where name ='spu_nhanthuongsanpham')
	drop proc spu_nhanthuongsanpham
go

create proc spu_nhanthuongsanpham(@IDNguoiDung int, @IDSanPham int, @SoLuong int, @DonGia decimal, @TongGia decimal, @IDTrangThaiSanPham int, @IDDaiLyNhanSanPham int, @DiemThuong int, @TongDiemThuong int)
as
	begin tran
	set tran isolation level SERIALIZABLE;
	declare @SoLuongSanPham int, @DiemThuongConLai int
	select @SoLuongSanPham=SoLuong from SanPham with (UPDLOCK) where ID=@IDSanPham and ThoiGianBatDauBan<=GETDATE() and ThoiGianKetThucBan>=GETDATE()
	select @DiemThuongConLai=DiemThuong from NguoiDung with (UPDLOCK) where ID=@IDNguoiDung
	if(@DiemThuongConLai<@TongDiemThuong)
	begin
		raiserror(N'Không thể đổi thưởng vì điểm thưởng còn lại không đủ',16,1)
		rollback tran
		return
	end
	if(@SoLuongSanPham is null)
	begin
		raiserror(N'Không thể đổi thưởng vì sản phẩm đã hết thời hạn bán',16,1)
		rollback tran
		return
	end
	if(@SoLuongSanPham<@SoLuong)
	begin
		raiserror(N'Không thể đổi thưởng số lượng vượt quá số lượng còn lại của sản phẩm',16,1)
		rollback tran
		return
	end	
	update SanPham set SoLuong=SoLuong-@SoLuong where ID=@IDSanPham
	update NguoiDung set DiemThuong=DiemThuong-@TongDiemThuong where ID=@IDNguoiDung
	insert into NguoiDung_SanPham(IDNguoiDung,IDSanPham,SoLuong,DonGia,TongGia,NgayMua,IDTrangThaiSanPham,IDDaiLyNhanSanPham,IsPhanThuong,DiemThuong,TongDiemThuong) values(@IDNguoiDung,@IDSanPham,@SoLuong,@DonGia,@TongGia,GETDATE(),@IDTrangThaiSanPham,@IDDaiLyNhanSanPham,1,@DiemThuong,@TongDiemThuong)
	if(@@ERROR<>0)
	begin
		raiserror(N'Đã có lỗi trong quá trình đổi thưởng sản phẩm',16,1)
		rollback tran
		return
	end
	commit tran
go